package ch6;

/**
 * 线程特有对象ThreadLocal可能存在的问题：
 * 退化与数据错乱：在一个线程可以执行多个任务的情况下，使用线程特有对象，需要确保每个任务
 *               的处理逻辑被执行前相应的线程持有对象的状态不受前一个被执行的任务影响。
 *
 * 在preRun方法中将线程特有对象HashMap的内容清空，
 * 以避免前一个任务执行时更改了线程特有对象的状态对当前执行的任务造成影响。
 */

import java.util.HashMap;

public abstract class XAbstractTask implements Runnable{
    static ThreadLocal<HashMap<String, String>> configHolder = new ThreadLocal<HashMap<String, String>>() {
        @Override
        protected HashMap<String, String> initialValue() {
            return new HashMap<String, String>();
        }
    };

    // 该方法总是会在任务处理逻辑被执行前执行
    protected void preRun() {
        // 清空线程特有对象HashMap实例，保证每个任务执行前HashMap的内容是干净的
        configHolder.get().clear();
    }

    private void postRun() {
        // 什么都不做
    }

    // 暴露给子类用于实现任务处理逻辑
    protected abstract void doRun();

    @Override
    public final void run() {
        try {
            preRun();
            doRun();
        } finally {
            postRun();
        }
    }
}
